const { body } = require('express-validator');

/**
 * 用户创建验证规则
 */
const validateUserCreation = [
  body('username')
    .isLength({ min: 3, max: 50 })
    .withMessage('用户名长度必须在3-50个字符之间')
    .matches(/^[a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含字母、数字和下划线'),
  
  body('password')
    .isLength({ min: 6, max: 100 })
    .withMessage('密码长度必须在6-100个字符之间')
    .matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/)
    .withMessage('密码必须包含至少一个小写字母、一个大写字母和一个数字'),
  
  body('email')
    .isEmail()
    .withMessage('请输入有效的邮箱地址')
    .normalizeEmail(),
  
  body('fullName')
    .isLength({ min: 2, max: 100 })
    .withMessage('姓名长度必须在2-100个字符之间')
    .trim(),
  
  body('role')
    .optional()
    .isIn(['admin', 'doctor', 'nurse', 'user'])
    .withMessage('角色必须是admin、doctor、nurse或user之一'),
  
  body('phone')
    .optional()
    .isMobilePhone('zh-CN')
    .withMessage('请输入有效的手机号码'),
  
  body('department')
    .optional()
    .isLength({ min: 2, max: 100 })
    .withMessage('部门名称长度必须在2-100个字符之间')
    .trim()
];

/**
 * 用户登录验证规则
 */
const validateUserLogin = [
  body('username')
    .notEmpty()
    .withMessage('用户名不能为空')
    .trim(),
  
  body('password')
    .notEmpty()
    .withMessage('密码不能为空')
];

/**
 * 用户更新验证规则
 */
const validateUserUpdate = [
  body('username')
    .optional()
    .isLength({ min: 3, max: 50 })
    .withMessage('用户名长度必须在3-50个字符之间')
    .matches(/^[a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含字母、数字和下划线'),
  
  body('email')
    .optional()
    .isEmail()
    .withMessage('请输入有效的邮箱地址')
    .normalizeEmail(),
  
  body('fullName')
    .optional()
    .isLength({ min: 2, max: 100 })
    .withMessage('姓名长度必须在2-100个字符之间')
    .trim(),
  
  body('role')
    .optional()
    .isIn(['admin', 'doctor', 'nurse', 'user'])
    .withMessage('角色必须是admin、doctor、nurse或user之一'),
  
  body('phone')
    .optional()
    .isMobilePhone('zh-CN')
    .withMessage('请输入有效的手机号码'),
  
  body('department')
    .optional()
    .isLength({ min: 2, max: 100 })
    .withMessage('部门名称长度必须在2-100个字符之间')
    .trim(),
  
  body('password')
    .optional()
    .isLength({ min: 6, max: 100 })
    .withMessage('密码长度必须在6-100个字符之间')
    .matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/)
    .withMessage('密码必须包含至少一个小写字母、一个大写字母和一个数字')
];

/**
 * 修改密码验证规则
 */
const validatePasswordChange = [
  body('oldPassword')
    .notEmpty()
    .withMessage('旧密码不能为空'),
  
  body('newPassword')
    .isLength({ min: 6, max: 100 })
    .withMessage('新密码长度必须在6-100个字符之间')
    .matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/)
    .withMessage('新密码必须包含至少一个小写字母、一个大写字母和一个数字'),
  
  body('confirmPassword')
    .custom((value, { req }) => {
      if (value !== req.body.newPassword) {
        throw new Error('确认密码与新密码不匹配');
      }
      return true;
    })
];

module.exports = {
  validateUserCreation,
  validateUserLogin,
  validateUserUpdate,
  validatePasswordChange
};